package ranveterinaria.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import ranveterinaria.excepcion.DAOExcepcion;
import ranveterinaria.modelo.ComprobanteCabeceraModelo;
import ranveterinaria.modelo.ComprobanteDetalleModelo;
import ranveterinaria.modelo.ProductoModelo;
import ranveterinaria.util.ConexionBD;

public class ComprobanteDetalleDAO extends BaseDAO {
	
public void insertar(ComprobanteDetalleModelo vo) throws DAOExcepcion {
		
		String query = "insert into comprobante_detalle(CODIGO_COMPROBANTE,CODIGO_PRODUCTO,CANTIDAD_PRODUCTO) values (?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);

			stmt.setInt(1,vo.getComprobante().getIdComprobante());
			stmt.setInt(2, vo.getProducto().getIdProducto());
			stmt.setInt(3, vo.getCantidad());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			
			
	
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

public ArrayList<ArrayList<String>> obtenerDetalle(int comprobante) throws Exception {
	ArrayList<ArrayList<String>> vo = new ArrayList<ArrayList<String>>();
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	try {
		String query = "SELECT D.CANTIDAD_PRODUCTO,P.NOMBRE_PRODUCTO,P.PRECIO_PRODUCTO,(SELECT DESCUENTO_PROMOCION FROM PROMOCION WHERE FECHA_INICIO < NOW() AND FECHA_EXPIRACION > NOW() AND CODIGO_PRODUCTO = P.CODIGO_PRODUCTO ORDER BY DESCUENTO_PROMOCION DESC LIMIT 1) FROM COMPROBANTE_DETALLE D INNER JOIN PRODUCTO P ON D.CODIGO_PRODUCTO = P.CODIGO_PRODUCTO WHERE D.CODIGO_COMPROBANTE = ?;";
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setInt(1, comprobante);
		rs = stmt.executeQuery();
		
		while (rs.next()) {
			
			ArrayList<String> comprobanteCabecera = new ArrayList<String>();
			
			comprobanteCabecera.add(rs.getString(1));	
			comprobanteCabecera.add(rs.getString(2));
			comprobanteCabecera.add(rs.getString(3));
			
			if(!(""+rs.getString(4)).equals("null")){ 
				comprobanteCabecera.add(rs.getString(4));
				comprobanteCabecera.add("" + Double.parseDouble(rs.getString(3)) * (1 - Double.parseDouble(rs.getString(4)))); 
				comprobanteCabecera.add(""+((Integer.parseInt(rs.getString(1)))*(Double.parseDouble(rs.getString(3)) * (1 - Double.parseDouble(rs.getString(4))))));				
			}else{
				comprobanteCabecera.add("0.00");
				comprobanteCabecera.add(rs.getString(3));
				comprobanteCabecera.add(""+((Integer.parseInt(rs.getString(1)))*(Double.parseDouble(rs.getString(3)))));
			}

			vo.add(comprobanteCabecera);
		}
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return vo;
}

public void eliminar(int comprobante) throws DAOExcepcion {
	String query = "delete from comprobante_cabecera WHERE CODIGO_COMPROBANTE=?";
	Connection con = null;
	PreparedStatement stmt = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setInt(1, comprobante);
		int i = stmt.executeUpdate();
		if (i != 1) {
			throw new SQLException("No se pudo eliminar");
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
}

public ComprobanteDetalleModelo actualizar(ComprobanteDetalleModelo vo) throws DAOExcepcion {
	String query = "update comprobante_detalle set CODIGO_PRODUCTO=?,CANTIDAD_PRODUCTO where CODIGO_COMPROBANTE=?";
	Connection con = null;
	PreparedStatement stmt = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		
		stmt.setInt(1,vo.getProducto().getIdProducto());
		stmt.setInt(2, vo.getCantidad());
		
		int i = stmt.executeUpdate();
		if (i != 1) {
			throw new SQLException("No se pudo actualizar");
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return vo;
}

public Collection<ComprobanteDetalleModelo> listar() throws DAOExcepcion {
	Collection<ComprobanteDetalleModelo> c = new ArrayList<ComprobanteDetalleModelo>();
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	try {
		con = ConexionBD.obtenerConexion();
		String query = "select CODIGO_COMPROBANTE,CODIGO_PRODUCTO,CANTIDAD_PRODUCTO from comprobante_detalle order by CODIGO_COMPROBANTE";
		stmt = con.prepareStatement(query);
		rs = stmt.executeQuery();
		while (rs.next()) {
			ComprobanteDetalleModelo vo = new ComprobanteDetalleModelo();
			
			ComprobanteCabeceraModelo comprobante = new ComprobanteCabeceraModelo();
			
			comprobante.setIdComprobante(rs.getInt("CODIGO_COMPROBANTE"));
			
			ProductoModelo producto = new ProductoModelo();
			
			producto.setIdProducto(rs.getInt("CODIGO_PRODUCTO"));
			vo.setCantidad(rs.getInt("CANTIDAD_PRODUCTO"));
			
			c.add(vo);
		}

	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return c;
}

}
